package 框架学习.SpringBoot.应用.分层解耦.解耦.概述;

public class index {
    public static void main(String[] args) {
        //解耦：
        //解除耦合

        //两个概念：
        //内聚：软件中各个功能模块内部的功能联系
        //耦合：衡量软件中各个层/模块之间的依赖、关联程度

        //在之前编写的三层架构的程序中（项目springboot-showEmployee-three-tier-architecture）
        //controller层调用了service
        //service层调用了dao
        //当service层类名变化，或需要切换一个实现类，controller中代码也需要修改
        //dao也同理
        //我们就称
        //controller和service之间耦合了
        //service和dao之间也耦合了

        //而在软件设计中有一个原则：高内聚、低耦合

        //思路：
        //可以提供一个容器
        //这个容器用来存储对象
        //比如需要用到EmpServiceA这个类的实例对象(项目springboot-showEmployee-three-tier-architecture中)
        //就只需要把这个类创建出来的对象放在这个容器中（假设叫做A对象）
        //controller运行时需要用到service类型的对象，就可以去容器中查找这个类型的对象
        //找到之后就可以把这个对象赋值给controller中声明的对象

        //而当要切换实现类的时候
        //就把另一个实现类对象（假设叫做B对象）放进容器
        //controller运行时再到容器中查找是否有service类型的变量
        //这个时候容器中有一个B对象
        //就可以把这个对象赋值给controller中声明的对象


        //这里就出现了两个问题：
        //问题1：对象如何交给容器进行管理
        //问题2：容器如何为程序提供所依赖的资源

        //这里就涉及到spring中特别重要的两个概念：
        //1、控制反转（问题1）
        //2、依赖注入（问题2）

        //控制反转（Inversion Of Control）：简称IOC。对象的创建控制权由程序自身转移到外部（容器。也叫做IOC容器/Spring容器）
        //依赖注入（Dependency Injection）：简称DI。容器为程序提供运行时、所依赖的资源
        //Bean对象：在IOC容器中所创建管理的对象，统称为Bean对象

        //详见springboot-showEmp-IOC_DI项目

    }
}
